package com.gzhu.knowledgeAdmin.repository;

import com.gzhu.knowledgeAdmin.common.dto.TemplateDTO;
import com.gzhu.knowledgeAdmin.entity.Template;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 继承JpaRepository<User,Integer>
 *     User：要操作的表格对象
 *     Integer：主键 ID 的数据类型
 *
 *     继承的这个类里面封装了基本的增删改查方法直接调用即可，
 *     如果集成的方法没法满足需求，可以在此封装,但是一定要注意 “命名规范”
 */
@Repository(value = "templatesRepository")
public interface TemplateRepository extends JpaRepository<Template,Integer> {

    /**
     * 根据id,修改parentId
     * @param id
     * @param parentId
     * @return 返回影响的行数
     */
    @Modifying
    @Transactional
    @Query("update Template set parentId = ?2 where id = ?1")
    int updateParentIdById(Integer id,Integer parentId);

    /**
     * 根据多个id,查找存在多少数据
     * @param id
     * @return 查找到的数量
     */
    int countByIdIn(Integer... id);

    /**
     * 根据name获取模板
     * @param name
     * @return
     */
    Template getFirstByName(String name);

    /**
     * 根据name和公司id获取模板
     * @param name
     * @return
     */
    @Query(value = "select * from t_hsmb_t where name = ?1 and f_gsid = ?2 limit 1",nativeQuery = true)
    Template getFirstByNameAndGSID(String name, String GSID);

    /**
     * 根据name和公司id获取模板
     * @param name
     * @return
     */
    @Query(value = "select * from t_hsmb_t where name = ?1 and f_gsid = ?2",nativeQuery = true)
    List<Template> getTemplateByNameAndGSID(String name, String GSID);

    /**
     * 根据type获取template,主要是获取开场白
     * @param type
     * @return
     */
    List<Template> getTemplateByType(String type);

    /**
     * 根据type和公司id获取template,主要是获取开场白
     * @param type
     * @return
     */
    List<Template> getTemplateByTypeAndGsid(String type, String gsid);

    /**
     * 根据ids获取到含有template中  name属性和f_gsid的实体类集合
     * @param ids
     * @return
     */
    @Query(value = "select new com.gzhu.knowledgeAdmin.common.dto.TemplateDTO(t.name,t.gsid) from Template t where id in ?1")
    List<TemplateDTO> getTemplateDTOByIds(List<Integer> ids);

    /**
     * 根据name,修改name
     * @return 返回受影响的行数
     */
    @Modifying
    @Transactional
    @Query("update Template set status = ?2 where id in (?1)")
    int updateStatusByIds(List<Integer> idList,Integer status);

    /**
     * 根据name,修改name
     * @param originalName 原始的name
     * @param name 修改后的name
     * @return 返回受影响的行数
     */
    @Modifying
    @Transactional
    @Query("update Template set name = ?2 where name = ?1")
    int updateName(String originalName,String name);

    /**
     * 根据name,修改name
     * @param originalName 原始的name
     * @param name 修改后的name
     * @return 返回受影响的行数
     */
    @Modifying
    @Transactional
    @Query("update Template set name = ?3 where name = ?1 and gsid = ?2")
    int updateName(String originalName,String GSID,String name);

    /**
     * 根据name,修改category
     * @param name name
     * @param category 修改后的category
     * @return 返回受影响的行数
     */
    @Modifying
    @Transactional
    @Query("update Template set category = ?2 where name = ?1")
    int updateCategory(String name,String category);

    /**
     * 根据name,修改scene
     * @param name name
     * @param scene 修改后的scene
     * @return 返回受影响的行数
     */
    @Modifying
    @Transactional
    @Query("update Template set scene = ?2 where name = ?1")
    int updateScene(String name,String scene);

    /**
     * 根据originalName,修改name,category,scene
     * @param originalName 原本的name
     * @param newName 新的name
     * @param category 修改后的分类category
     * @param scene 修改后的应用场景scene
     * @return 返回受影响的行数
     */
    @Modifying
    @Transactional
    @Query("update Template set name = ?2,category = ?3,scene = ?4 where name = ?1")
    int updateNameAndCategoryAndScene(String originalName,String newName,String category,String scene);

    /**
     * 根据name,修改状态
     * @param name name
     * @param status 修改后的status
     * @return 返回受影响的行数
     */
    @Modifying
    @Transactional
    @Query("update Template set status = ?2 where name = ?1")
    int updateStatus(String name,Integer status);


    /**
     * 根据name和gsid,修改状态
     * @param name name
     * @param GSID 公司id
     * @param status 修改后的status
     * @return 返回受影响的行数
     */
    @Modifying
    @Transactional
    @Query("update Template set status = ?3 where name = ?1 and gsid = ?2")
    int updateStatus(String name,String GSID,Integer status);

    /**
     * 根据name删除template
     * @param name
     * @return
     */
    int deleteTemplateByName(String name);

    /**
     * 根据name和gsid删除template
     * @param name
     * @return
     */
    @Modifying
    @Transactional
    @Query("delete from Template where name = ?1 and gsid = ?2")
    int deleteTemplateByNameAndGSID(String name,String GSID);

    /**
     * 根据idList删除所有对应的template
     * @param idList
     * @return 返回删除的行数
     */
    int deleteTemplateByIdIn(List<Integer> idList);

    /**
     * 根据name集合,获取到所对应的Template
     * @param nameList
     * @return
     */
    List<Template> getTemplateByNameIn(List<String> nameList);

}
